home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / 8bit / cislib_b / ram14k.asm < prev    next >
Assembly Source File  |  1995-04-22  |  11KB  |  306 lines

  1. 1000 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. 1010 ;
  3. 1020 ; Special Patch program to allow 800XL owners to use
  4. 1030 ;   Atari DOS 2.5 with a small RamDisk.
  5. 1040 ;
  6. 1050 ; Theoretical size of disk is 16KBytes,
  7. 1060 ;   but 2KBytes are lost to the I/O registers
  8. 1070 ;   at $D000 to $D7FF and about 1KBytes
  9. 1080 ;   are lost to overhead.   Net is just
  10. 1090 ;   over 13KBytes.
  11. 1100 ;
  12. 1110 ;
  13. 1120 ; See COMPUTE! magazine, October 1986 issue,
  14. 1130 ;   for accompanying article:
  15. 1140 ;      INSIGHT: ATARI
  16. 1150 ;
  17. 1160 ; Program by Bill Wilkinson
  18. 1170 ;   released to the public domain
  19. 1180 ;
  20. 1190 ; Article is Copyright (c) 1986 by COMPUTE!
  21. 1200 ;   Contact COMPUTE! magazine for reprint
  22. 1210 ;   permission, etc.
  23. 1220 ;
  24. 1230 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  25. 1240 ;
  26. 1250 RAM.DRIVE.NUM = 8 ; RamDisk is drive 8
  27. 1260     .PAGE ".     Equates to DOS 2.5 Locations"
  28. 1270 ;
  29. 1280 ; Locations which must be patched to change
  30. 1290 ;   drive number of RamDisk.
  31. 1300 ;
  32. 1310 ; (See also August 1986 issue of Compute!)
  33. 1320 ;
  34. 1330 DPATCH1 = $0780 ; in BSIO routine
  35. 1340 DPATCH2 = $0B89 ; in FORMAT routine
  36. 1350 ;
  37. 1360 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  38. 1370 ;
  39. 1380 ; Location that says which drive MEM.SAV and DUP.SYS
  40. 1390 ;   are located on (contains ATASCII character--
  41. 1400 ;   not just a byte value)
  42. 1410 ;
  43. 1420 DRV.MEMDUP = $153F ; just before Mini-DUP
  44. 1430 ;
  45. 1440 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  46. 1450 ;
  47. 1460 ; Addresses of subroutines that we must alter
  48. 1470 ;
  49. 1480 RAMIO.PATCH = $148D ; RamDisk "I/O" routine
  50. 1490 SETBANK = $12DE ; sets PIA to select proper bank
  51. 1500 ;
  52. 1510 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  53. 1520 ;
  54. 1530 ; Miscellaneous vital locations, equated
  55. 1540 ;   values, and routines as used by DOS 2.5
  56. 1550 ;
  57. 1560 RAMSYNC = $12CB ; routine which synchronizes RamDisk transfers
  58. 1570 WRTVTOC = $1094 ; write current VTOC back to disk
  59. 1580 ;
  60. 1590 VTOCPTR = $45   ; pointer to VTOC in memory
  61. 1600 ;
  62. 1610 DRIVE.MASK = $070A ; the infamous "1802" location
  63. 1620 ;
  64. 1630 INITDOS = $07E0 ; same as DOS 2.0 and others
  65. 1640 FASTRAM = $07DF ; flag:  + ==>> sync with VBI
  66. 1650 PIABPORT = $D301 ; master bank selector, etc.
  67. 1660 DCBSEC = $030A  ; sector number in DCB
  68. 1670 ZTEMP1 = $43    ; zero page temporary loc'n
  69. 1680 E.NAK = $8B     ; "NAK" error code from "drive"
  70. 1690 ;
  71. 1700 ; Equates used to call CIO
  72. 1710 ;
  73. 1720 XIO.FMT = 254   ; Format command
  74. 1730 IOCB =  $0340   ; address of first IOCB
  75. 1740 IOCB.CMD = IOCB+2 ; where command goes in IOCB
  76. 1750 IOCB.BUF = IOCB+4 ; buffer (or name) address
  77. 1760 IOCB.AUX1 = IOCB+10 ; Auxilliary byte 1
  78. 1770 IOCB.AUX2 = IOCB+11 ; Auxilliary byte 2
  79. 1780 ;
  80. 1790 CIOV =  $E456   ; the classic location
  81. 1800 ;
  82. 1810 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  83. 1820     .PAGE ".    Generate Small Patches"
  84. 1830 ;
  85. 1840 ; First, we generate the single byte patches
  86. 1850 ;
  87. 1860     *=  FASTRAM
  88. 1870     .BYTE 0     ; set flag to say we need
  89. 1880     ;           synchronized transfers
  90. 1890 ;
  91. 1900     *=  DPATCH1
  92. 1910     .BYTE RAM.DRIVE.NUM ; we use "-1" as a flag to the
  93. 1920     ;           BASIC program...it MUST be
  94. 1930     ;           replaced with a number from 2 to 8
  95. 1940 ;
  96. 1950     *=  DPATCH2
  97. 1960     .BYTE RAM.DRIVE.NUM ; ditto
  98. 1970 ;
  99. 1980     *=  DRV.MEMDUP
  100. 1990     .BYTE '1    ; forces MEM.SAV and DUP.SYS
  101. 2000     ;           to reside on physical drive 1
  102. 2010 ;
  103. 2020 ;
  104. 2030 ;
  105. 2040 ;
  106. 2050 ; Patch to RAMIO:
  107. 2060 ;
  108. 2070 ; At the beginning of RAMIO, DOS 2.5 validates
  109. 2080 ;   the sector number to be sure it gets a valid
  110. 2090 ;   bank number
  111. 2100 ;
  112. 2110 ; If the bank number is bad, the Y-register
  113. 2120 ;   is given an error code indicating the
  114. 2130 ;   "disk" returned a "NAK" code.
  115. 2140 ;
  116. 2150 ; We patch in where the bank number is being
  117. 2160 ;   checked...it used to be checked via
  118. 2170 ;   a "CMP #4" but now we have a smaller "DISK".
  119. 2180 ;
  120. 2190     *=  RAMIO.PATCH
  121. 2200     CMP #3      ; sector must be in banks 0,1,2
  122. 2210     BCC SECOK   ; it is...assume it is okay
  123. 2220     PLP         ; needed to clean up stack
  124. 2230     LDY #E.NAK  ; too bad...give error
  125. 2240     RTS         ; used to be "BNE" to a RTS...dumb!
  126. 2250 ;
  127. 2260 SECOK
  128. 2270     JSR RAMSYNC ; synchronize and select bank
  129. 2280     LDA ZTEMP1  ; get sector # times 2
  130. 2290     LSR A       ; now sector #
  131. 2300     LSR A       ; now sector # divided by 2
  132. 2310     ORA #$C0    ; ensure address is in range ($C000-$FFFF)
  133. 2320 ;
  134. 2330 ; rest of code is okay!
  135. 2340 ;
  136. 2350 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  137. 2360 ;
  138. 2370 ; Patch to SETBANK:
  139. 2380 ;
  140. 2390 ; The entire routine is replaced
  141. 2400 ;
  142. 2410 ; ENTER:  A-register = 0,1,2,3,4
  143. 2420 ;         If 4, then Main Memory is needed (ROMs)
  144. 2430 ;         Else, RAM is needed.
  145. 2440 ;
  146. 2450     *=  SETBANK
  147. 2460     ROR A       ; If A-register was 4 on entry...
  148. 2470     ROR A       ; ...then these 3 ROR's...
  149. 2480     ROR A       ; ...will set the carry bi5z}2490     PHP         ; so save the carry for a nonce
  150. 2500     LDA PIABPORT ; and get current bank select info
  151. 2510     LSR A       ; strip it of its LSBit
  152. 2520     PLP         ; recover the carry...
  153. 2530     ROL A       ; ...and carry becomes ROM select!!!
  154. 2540     STA PIABPORT ; changes RAM to ROM or v.v.
  155. 2550     RTS         ; saved a byte, actually!
  156. 2560 ;
  157. 2570     .PAGE ".    The FORMAT fixer-upper"
  158. 2580 ;
  159. 2590 ; Up until now, we have just patched DOS 2.5.
  160. 2600 ;
  161. 2610 ; Now, we must do several steps:
  162. 2620 ;
  163. 2630 ;  1. Reinitialize DOS
  164. 2640 ;  2. FORMAT the RamDisk
  165. 2650 ;  3. Alter the VTOC
  166. 2660 ;
  167. 2670 ; Step 3 is necessary because DOS 2.5's
  168. 2680 ;   FORMAT routine assumes (A) that a disk
  169. 2690 ;   is large enough that the VTOC and
  170. 2700 ;   DIRECTORY can occupy sectors $168 to
  171. 2710 ;   $170 and (B) that (except for the boot
  172. 2720 ;   sectors and the VTOC and DIRECTORY)
  173. 2730 ;   available sector are continuous from
  174. 2740 ;   1 to the max sector number.
  175. 2750 ;   We set bits to zero in the VTOC to
  176. 2760 ;   inform DOS 2.5 that the corresponding
  177. 2770 ;   sectors are not really there!
  178. 2780 ;
  179. 2790     *=  $8000   ; my favorite place
  180. 2800 ;
  181. 2810 ; begin the actual code:
  182. 2820 ;
  183. 2830 DOPATCH
  184. 2840     LDA DRIVE.MASK ; to active drives...
  185. 2850     ORA #$80    ; ...include this drive
  186. 2860     STA DRIVE.MASK ; and update the mask
  187. 2870 ;
  188. 2880     JSR INITDOS ; because the load process
  189. 2890     ;           changed several things, possibly
  190. 2900     ;           including the drive table, etc.
  191. 2910 ;
  192. 2920 ; now set up for the XIO for format
  193. 2930 ;
  194. 2940     LDX #$70    ; we will use channel 7 for this
  195. 2950     LDA #XIO.FMT ; the format command
  196. 2960     STA IOCB.CMD,X ; is first item on agenda!
  197. 2970     LDA #DRV.NAME&$FF ; LSB of address of drive name
  198. 2980     STA IOCB.BUF,X ; to IOCB
  199. 2990     LDA #DRV.NAME/$0100 ; then MSB
  200. 3000     STA IOCB.BUF+1,X ; also to IOCB
  201. 3010     LDA #0
  202. 3020     STA IOCB.AUX1,X ; probably unnecessary...
  203. 3030     STA IOCB.AUX2,X ; but best to simulate BASIC call
  204. 3040     JSR CIOV    ; call CIO to FORMAT the disk
  205. 3050     BMI OOPS    ; but we can't handle an error! (do nothing)
  206. 3060 ;
  207. 3070 ; okay...time to patch the VTOC
  208. 3080 ;
  209. 3090     LDY #SIZE.RVTOC
  210. 3100 LOOP
  211. 3110     LDA NEW.RVTOC,Y ; get a byte of modified VTOC
  212. 3120     STA (VTOCPTR),Y ; and put it into system VTOC
  213. 3130     DEY         ; more to do?
  214. 3140     BPL LOOP    ; yep
  215. 3150 ;
  216. 3160     JSR WRTVTOC ; so write out the modified VTOC
  217. 3170 OOPS
  218. 3180     RTS         ; and we are done!
  219. 3190 ;
  220. 3200 ; A string to hold drive name for XIO command
  221. 3210 ;
  222. 3220 DRV.NAME
  223. 3230     .BYTE "D"   ; We want "D2:" through "D8:"
  224. 3240     .BYTE '0+RAM.DRIVE.NUM ; flag for BASIC DATA stmts
  225. 3250     .BYTE ":"   ; end of string...
  226. 3260     .BYTE 0     ; except for this
  227. 3270 ;
  228. 3280 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  229. 3290 ;
  230. 3300     .PAGE ".     New VTOC layout for 14KB RamDisk"
  231. 3310     *=  $8100   ; (no reason...just to look pretty)
  232. 3320 ;
  233. 3330 ; Following are 74 bytes which define the appearance
  234. 3340 ;   of the VTOC for our 14KB RamDisk
  235. 3350 ;
  236. 3360 ; Some sneakies to observe:
  237. 3370 ;   even though we only use sector numbers
  238. 3380 ;   from $01 to $7F, we mark $68 through
  239. 3390 ;   $6B as being in use...this is because
  240. 3400 ;   our bank select routine maps sectos
  241. 3410 ;   $168 through $16B to the same memory
  242. 3